home *** CD-ROM | disk | FTP | other *** search
/ Racing Games (Spidla) / zavodni.iso / Fun Racing / src / FRTrackObjects.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2003-06-19  |  3.0 KB  |  145 lines

  1.  
  2. #include "FRTrackObjects.h"
  3. #include "FRCar.h"
  4.  
  5.  
  6. TERTTIImplementation(FRBarrier, TEEngineObject);
  7. TERTTIImplementation(FRRoadSign, TEEngineObject);
  8.  
  9.  
  10. FRBarrier::FRBarrier(TECustomEntity* pEnt)
  11. {
  12.     m_bClip = true;
  13.     m_fElasticity = 0.01f;
  14.     m_fFrictionFactor = 0.9f;
  15.     m_pBoundingVolume = new TEAABoundingBox;
  16.     m_pBoundingVolume->UpdateVolume(pEnt->m_pPolygonList, true);
  17.     m_Plane = *pEnt->m_pPolygonList->GetPlanes();
  18. }
  19.  
  20. bool FRBarrier::Clips(TEBoundingVolume &rVol, TEPlane &rPlane)
  21. {
  22.     if(m_pBoundingVolume->IntersectsVolume(rVol) && rVol.IntersectsVolume(m_Plane))
  23.     {
  24.         rPlane = m_Plane;
  25.         return true;
  26.     }
  27.     else return false;
  28. }
  29.  
  30. bool FRBarrier::VolStaticInfluence(UInt32 ulDeltaT, TEEngineObject* pObject)
  31. {
  32.     if(TEIsDerivedFromClass(FRCar, pObject))
  33.     {
  34.         TEBoundingVolume* pBound = pObject->GetBoundingVolume();
  35.  
  36.         if(m_pBoundingVolume->IntersectsVolume(*pBound) && pBound->IntersectsVolume(m_Plane))
  37.         {
  38.             TEVector C = pObject->GetCenter();
  39.             TEVector Tmp = pBound->GetCenter();
  40.             if(m_Plane.DistanceToPlane(Tmp) >= 0)
  41.             {
  42.                 pBound->PutOnPlane(m_Plane);
  43.                 C += pBound->GetCenter() - Tmp;
  44.                 pObject->SetCenter(C);
  45.                 return true;
  46.             }
  47.         }
  48.     }    
  49.  
  50.     return false;
  51. }
  52.  
  53.  
  54.  
  55. FRRoadSign::FRRoadSign(TECustomEntity* pEnt)
  56. {
  57.     TEOBoundingBox *pOBox = new TEOBoundingBox;
  58.     TEAABoundingBox BBox;
  59.     TEVector Min, Max;
  60.     TEString Name;
  61.  
  62.     m_Center = pEnt->m_Position;
  63.     m_Rotation.m_fY = *(Float*)(pEnt->m_acData+4);
  64.  
  65.     switch(*(Int32*)pEnt->m_acData){
  66.     default:
  67.     case 0:
  68.         Name = "sign-stop.tmf";
  69.         break;
  70.     case 1:
  71.         Name = "sign-sixty.tmf";
  72.         break;
  73.     case 2:
  74.         Name = "sign-hundred.tmf";
  75.         break;
  76.     case 3:
  77.         Name = "sign-empty.tmf";
  78.         break;
  79.     case 4:
  80.         Name = "sign-question.tmf";
  81.         break;
  82.     case 5:
  83.         Name = "sign-camel.tmf";
  84.         break;
  85.     };
  86.  
  87.     m_pModelRef = TEModelManager::GetModelManager()->GetModel(Name);
  88.  
  89.     Min = TEVector(2.0f, 2.0f, 2.0f);
  90.     m_pModelRef->SetScale(Min);
  91.  
  92.     TEAssert(m_pModelRef);
  93.  
  94.     BBox = m_pModelRef->GetModelBBox();
  95.     BBox.GetData(Min, Max);
  96.  
  97.     pOBox->SetData(m_Center, Min, Max, m_Rotation);
  98.  
  99.     m_pBoundingVolume = pOBox;
  100.  
  101.     m_bStatic = true;
  102.     m_fMass = 10.0f;
  103.     m_fElasticity = m_fFrictionFactor = 0.1f;
  104.     m_ulClipTime = 0;
  105. }
  106.  
  107. void FRRoadSign::Animate(UInt32 ulDeltaT, TEEngine* pEngine)
  108. {
  109.     if(m_ulClipTime != 0)
  110.     {
  111.         TEOBoundingBox* pBox = (TEOBoundingBox*) m_pBoundingVolume;
  112.         TEAABoundingBox BBox;
  113.         TEVector Min, Max;    
  114.  
  115.         m_ulClipTime += ulDeltaT;
  116.  
  117.         if(m_ulClipTime > 10000)
  118.             m_ulClipTime = 0;
  119.  
  120.         m_Rotation.m_fX += ulDeltaT * 0.36f;
  121.  
  122.         BBox = m_pModelRef->GetModelBBox();
  123.         BBox.GetData(Min, Max);
  124.         pBox->SetData(m_Center, Min, Max, m_Rotation);
  125.     }
  126. }
  127.  
  128. void FRRoadSign::OnClip(TEEngineObject* pInfluencer)
  129. {
  130.     if(!TEIsTypeOfClass(TEBSPTerrain, pInfluencer))
  131.     {
  132.         m_Velocity.m_fY = 100.0f;
  133.         m_bStatic = false;
  134.         m_bApplyGravity = true;
  135.         m_ulClipTime = 1;
  136.     }
  137.     else if(m_ulClipTime != 0)
  138.         m_ulClipTime = 0;
  139. }
  140.  
  141. bool FRRoadSign::VolStaticInfluence(UInt32 ulDeltaT, TEEngineObject* pObject)
  142. {
  143.     return VolVolInfluence(ulDeltaT, pObject);
  144. }
  145.